package com.changhong.framework.sdfs.namenode.server.nio;

import com.google.common.io.Files;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.io.*;
import java.nio.ByteBuffer;
import java.nio.channels.FileChannel;
import java.nio.charset.Charset;
import java.util.List;

/**
 * @author summer
 */
public class FileFlusher {
    private static final Logger logger = LoggerFactory.getLogger(FileFlusher.class);

    /**
     * 刷新数据到磁盘
     * @param data 数据数组
     * @param fileName 文件名称
     * @throws Exception 输盘异常
     */
    public static void flushDish(byte[] data,String fileName) throws Exception{
        ByteBuffer dataBuffer = ByteBuffer.wrap(data);
        RandomAccessFile file=null;
        FileOutputStream out=null;
        FileChannel editsLogFileChannel=null;
        try{
            file=getRandomAccessFile(fileName);
            out = new FileOutputStream(file.getFD());
            editsLogFileChannel = out.getChannel();
            editsLogFileChannel.write(dataBuffer);
            //强制把数据刷入磁盘上
            editsLogFileChannel.force(false);
        }
        finally {
            close(file);
            close(out);
            close(editsLogFileChannel);
        }
    }

    /**
     * 通过制定的文件路径删除文件
     * @param fileName 文件名称
     */
    public static void deleteFile(String fileName){
        File file = createFile(fileName);
        if(file.exists()){
            file.delete();
        }
    }

    /**
     * 创建文件对象
     * @param fileName 文件名称
     * @return 返回一个file对象流
     */
    private static File createFile(String fileName){
        return new File(fileName);
    }


    /**
     * 通过文件名称读取数据
     * @param fileName 文件名称
     * @return 返回读取的数据集合
     */
    public static List<String> readFileDataFromFileName(String fileName){
        try {
            List<String> datas = Files.readLines(createFile(fileName), Charset.forName("UTF-8"));
            return datas;
        } catch (IOException e) {
            logger.error("读取文件数据出现问题",e);
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 通过文件名称读取数据
     * @param fileName 数据缓冲数据
     * @return 返回数据缓冲
     */
    public static ByteBuffer getByteBufferByFileName(String fileName){
        try {
            byte[] bytes = Files.toByteArray(createFile(fileName));
            ByteBuffer wrap = ByteBuffer.wrap(bytes);
            return wrap;
        } catch (IOException e) {
            logger.error("读取文件数据出现问题",e);
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 关闭流
     * @param closeable 数据对象
     */
    public static void close(Closeable closeable){
        if(closeable==null){
            return;
        }
        try {
            closeable.close();
        } catch (IOException e) {
            logger.error("关闭流出现问题",e);
            e.printStackTrace();
        }
    }

    /**
     * 创建一个随机读取的文件读写
     * @param fileName 文件名称
     * @return 返回文件对象
     * @throws Exception 创建异常
     */
    public static RandomAccessFile getRandomAccessFile(String fileName) throws Exception{
        RandomAccessFile file = new RandomAccessFile(fileName, "rw");
        return file;
    }


}
